我需要找到一种在Haskell中隐式调用函数的方法,类似于implicit
在Scala中使用函数的方法。
我已经研究了使用隐式参数和函数中{-# LANGUAGE ImplicitParams #-}
所示的方法,但是如果不明确定义它,我将无法弄清楚如何实现类似的效果。
这是我的代码的简化版本
a :: Int -> Int
a n = n + 1
b :: [Char] -> Int
b cs = length cs
Run Code Online (Sandbox Code Playgroud)
我希望能够跑步
Test> a "how long" -- outputs 8, as it implicitly calls a (b "how long")
Run Code Online (Sandbox Code Playgroud)
以及
Test> a 5 -- outputs 6
Run Code Online (Sandbox Code Playgroud) 我试图在这里使用字符串插值,例如http://hackage.haskell.org/package/interpolate-0.2.0/docs/Data-String-Interpolate.html
特别,
>>> :set -XQuasiQuotes
>>> import Data.String.Interpolate
>>> let name = "Marvin"
>>> putStrLn [i|name: #{name}|]
name: Marvin
Run Code Online (Sandbox Code Playgroud)
如果我在ghci中运行它,效果很好。另外,如果我写一个像这里所示的文件,这也可以工作https://downloads.haskell.org/~ghc/7.6.3/docs/html/users_guide/ch04s02.html
{-# OPTIONS_GHC -XQuasiQuotes #-}
import Data.String.Interpolate
main = do
let name = "Marvin"
putStrLn [i|name: #{name}|]
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是使用选项并导入文件,然后在ghci中运行命令,则会收到错误消息 parse error on input'#'
-- in file example.hs
{-# OPTIONS_GHC -XQuasiQuotes #-}
import Data.String.Interpolate
-- in GHCi, ghci example.hs, then run
> let name = "Marvin"
> putStrLn [i|name: #{name}|]
`parse error on input'#'`
what's happening here and why can't i …
Run Code Online (Sandbox Code Playgroud) 我在嵌套的for循环和正确使用yield时遇到了麻烦。
问题是如果我有两个列表,形式为List [(Int,Int)]
val ls = (1,5)::(3,2)::(5,3)::Nil
val ls_two = (1,9)::(5,9)::(6,7)::Nil
Run Code Online (Sandbox Code Playgroud)
现在我想创建仅将键和所有列表的第二个int结合在一起的第三个列表,这样结果将是
val result = (1,5,9)::(5,3,9)::Nil
Run Code Online (Sandbox Code Playgroud)
我已经尝试过一些类似的变体,但似乎都没有用
val result = for(i <- ls) {
for(j <- ls_two) {
if(i._1 == j._1) yield (i._1,i._2,j._2)
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试将yield放置在for循环的末尾,如果我用println替换yield,这似乎可行,但是我不确定如何用yield。
另外,如果您有更实用的方法来解决此问题,将不胜感激,谢谢!
我正在阅读 Ivan Bratko 的《人工智能编程》一书,我陷入了一个基本问题并遇到了错误,并且之前关于堆栈溢出的答案似乎没有帮助。
我试图使用先前的事实作为参数来编写规则并收到错误
Single variables: [Y]
Run Code Online (Sandbox Code Playgroud)
我试图运行的代码是这样的
parent(myfather,me).
parent(mymother,me).
happy(X) :-
parent(X,Y).
Run Code Online (Sandbox Code Playgroud)
我过去曾成功制定过这样的规则,但我认为我只是错过了一些非常明显的东西,说明为什么这不起作用。我认为当编译并运行时
happy(myfather).
Run Code Online (Sandbox Code Playgroud)
它将返回true,因为它将用myfather替换happy规则中的X,然后用parent(myfather,Y)检查parent(X,Y)。然后尝试查看是否有一个事实表明父母(我的父亲,其他......)。
如果相关的话,我也在 macOS 上使用 swipl,谢谢。
编辑:
我没有检查,但程序实际上可以正常工作,但仍然发出警告,这是有道理的,但是有没有办法消除错误或理解为什么会出现错误?
我很难尝试编写一个函数来使用递归来查找两个列表的总和,如果任何列表为空,则可能是Nothing.
以下函数的数学运算是:
?w[i]x[i]
Run Code Online (Sandbox Code Playgroud)
其中w和x的长度等于int数组
这是我的工作代码:
example :: [Int] -> [Int] -> Int
example [] [] = 0
example (x:xs) (l:ls) = ((x*l) + (example xs ls))
Run Code Online (Sandbox Code Playgroud)
这是我想要工作的想法:
example :: [Int] -> [Int] -> Maybe Int
example [] [] = Nothing
example (x:xs) (l:ls) = Just((x*l) + (example xs ls))
Run Code Online (Sandbox Code Playgroud)
谢谢
什么是开始($)
或(>>=)
应该做的功能.我不是要问究竟是什么$
或>>=
意思,但我明白这一点
f :: Int -> Int
f x = x+2
Run Code Online (Sandbox Code Playgroud)
是一个取整数并添加两个的函数,但在学习Haskell的过程中我遇到的问题是解决方案如下所示:
($) :: (a -> b) -> (a -> b)
f $ x = f x
Run Code Online (Sandbox Code Playgroud)
我假设这意味着函数($)采用lambda(a - > b)并输出lambda(a - > b),然后下一行我不确定.
但我总是假设功能定义
f :: Int -> Int
Run Code Online (Sandbox Code Playgroud)
必须跟一个带有以f开头的参数的函数,就像我的第一个代码示例一样.
谢谢
如何在函数中间输出某些内容,但仍返回IO()以外的内容?
f :: Int -> Int
f n = do
print n
n + 1
Run Code Online (Sandbox Code Playgroud)
谢谢