小编w12*_*220的帖子

隐式调用函数

我需要找到一种在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)

haskell implicit

4
推荐指数
1
解决办法
77
查看次数

在ghci中设置选项

我试图在这里使用字符串插值,例如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)

haskell

4
推荐指数
1
解决办法
39
查看次数

如果嵌套嵌套循环后的收益

我在嵌套的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。

另外,如果您有更实用的方法来解决此问题,将不胜感激,谢谢!

functional-programming scala

3
推荐指数
1
解决办法
632
查看次数

单例变量错误

我正在阅读 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,谢谢。

编辑:

我没有检查,但程序实际上可以正常工作,但仍然发出警告,这是有道理的,但是有没有办法消除错误或理解为什么会出现错误?

prolog

3
推荐指数
1
解决办法
5486
查看次数

与Maybe的递归

我很难尝试编写一个函数来使用递归来查找两个列表的总和,如果任何列表为空,则可能是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)

谢谢

recursion haskell immutability

0
推荐指数
1
解决办法
302
查看次数

命名函数($)或(>> =)

什么是开始($)(>>=)应该做的功能.我不是要问究竟是什么$>>=意思,但我明白这一点

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)

来自Haskell的$ mean/do是什么?

我假设这意味着函数($)采用lambda(a - > b)并输出lambda(a - > b),然后下一行我不确定.

但我总是假设功能定义

f :: Int -> Int
Run Code Online (Sandbox Code Playgroud)

必须跟一个带有以f开头的参数的函数,就像我的第一个代码示例一样.

谢谢

haskell

0
推荐指数
1
解决办法
120
查看次数

在功能中间输出

如何在函数中间输出某些内容,但仍返回IO()以外的内容?

f :: Int -> Int
f n = do
    print n
    n + 1
Run Code Online (Sandbox Code Playgroud)

谢谢

haskell

0
推荐指数
2
解决办法
70
查看次数